package com.security.web.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 切片
 * 1 . 切入点（注解）
 * ------ 1.1 在哪儿些方法起作用
 * ------ 1.2 在什么时候起作用
 * 2 . 增强（方法）
 * ------ 2.1 起作用时执行的业务逻辑
 *
 * 能拿到执行方法的值，不能拿到Http的请求
 * @author roger
 * @email 190642964@qq.com
 * @create 2017-11-01 17:47
 **/
@Aspect
//@Component
public class TimeAspect {

    // 调用之前
//    @Before()

    // 方法调用之后
//    @After()

    // 方法抛出异常时
//    @AfterThrowing

    // 前、后、异常
    // UserRest类下任何一个方法、任何参数
    @Around("execution(* com.security.rest.UserRest.*(..))")
    public Object handlerControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("time aspect start");

        Object[] args = pjp.getArgs();
        for (Object arg : args) {
            System.out.println("arg is " + arg);
        }

        long start = System.currentTimeMillis();
        // 调用核心方法
        Object retVal = pjp.proceed();
        long finish = System.currentTimeMillis();

        System.out.println("耗时 : " + (finish - start));

        System.out.println("time aspect finish");

        return retVal;
    }

}
